Кэширование данных заключается в сохранении некоторой переменной PHP в кэше и её последующем извлечении. Оно является основой для расширенных возможностей, таких как кэширование запросов и кэширование страниц. Типичные варианты кэширования и получения данных:
// пробуем извлечь $data из кеша
$data = $cache->get($key);
if ($data === false) {
// $data нет в кеше, вычисляем заново
$data = $this->calculateSomething();
// сохраняем значение $data в кеше
$cache->set($key, $data);
}
// значение $data доступно здесь
$data = $cache->getOrSet($key, function () {
return $this->calculateSomething();
});
Когда анонимной функции требуются данные из внешней области видимости:
$user_id = 42;
$data = $cache->getOrSet($key, function () use ($user_id) {
return $this->calculateSomething($user_id);
});
Компоненты кэширования
Кэширование данных опирается на компоненты кэширования, которые представляют различные хранилища, такие как память, файлы и базы данных. Кеш-компоненты, как правило, зарегистрированы в качестве компонентов приложения, так что их можно настраивать и обращаться к ним глобально.
Кэширование с использованием файлов:
$config = [
/*...*/
'components' => [
/*...*/
'cache' => [
'class' => 'yii\caching\FileCache',
],
/*...*/
],
/*...*/
];
Кэширование с использованием Memcached с двумя серверами:
$config = [
/*...*/
'components' => [
/*...*/
'cache' => [
'class' => 'yii\caching\MemCache',
'servers' => [
[
'host' => 'server1',
'port' => 11211,
'weight' => 100,
],
[
'host' => 'server2',
'port' => 11211,
'weight' => 50,
],
],
/*...*/
],
/*...*/
];
Теперь получить доступ к компоненту кэша можно используя выражение Yii::$app->cache.
Класс yii\caching\Cache
У всех компонентов кэша имеется один базовый класс yii\caching\Cache со следующими методами:
- get() — возвращает данные по ключу
- set() — сохраняет данные по ключу
- add() — сохраняет данные по ключу, если такого ключа ещё нет
- getOrSet() — возвращает данные по указанному ключу
- multiGet() — извлекает сразу несколько элементов
- multiSet() — сохраняет несколько элементов данных
- multiAdd() — сохраняет несколько элементов данных
- exists() — есть ли указанный ключ в кэше
- delete() — удаляет указанный ключ
- flush() — удаляет все данные
Нельзя кешировать значение false, потому что метод get() использует false для случая, когда данные не найдены в кеше. Но можно обернуть false в массив и закешировать его, чтобы обойти это ограничение.
Срок действия кеша
Данные, сохраненные в кеш, остаются там навсегда и могут быть удалены только из-за особенностей функционирования хранилища (например, место для кэширования заполнено и старые данные удаляются). Чтобы изменить этот режим, можно передать время жизни кеша при вызове метода set():
// хранить данные не более 45 секунд
$cache->set($key, $data, 45);
Можно изменить значение по умолчанию (бесконечность) для длительности кэширования, задав defaultDuration в конфигурации компонента кеша.